/*************************************************************************************
 * Nombre del archivo: Semaforo.java
 * Universidad del Valle de Guatemala
 * Curso: Sistemas Operativos
 * @author martin
 *          Martín Guzmán 08041
 * Fecha: Marzo de 2010
 * Descripción:
*************************************************************************************/
import java.util.LinkedList;


public class Semaforo {

    LinkedList<Proceso> lista = new LinkedList<Proceso>();
    int identificador = -1;
    int contador=-1;

    public Semaforo(){
        contador=1;
    }

    public Semaforo(int identificador){
        this.identificador = identificador;
        this.contador=1;
    }

    /***********************************************
     * Método: Wait
     * Uso:
     * @return booleano que dice si hay que encolar el proceso o no
    ***********************************************/
    public boolean Wait(){
        this.contador--;
        if(contador<0){
            //agrear este proceso a waiting queue
            //block();
            return true;
        }
        return false;
    }

    /***********************************************
     * Método: Signal
     * Uso:
     * @return booleano que dice si hay que sacar el proceso encolado o no
    ***********************************************/
    public boolean Signal(){
        this.contador++;
        if(contador<=0){
            //remover proceso P de la waiting queue
            //wakeup(P)
            if(this.lista.isEmpty())
                return false; //porque no hay ningún proeso que sacar ya que la cola está vacía
            return true;//para sí sacar el proceso...
        }
        return false;
    }
    

    public void Agregar_a_cola(Proceso proc){
        proc.setEstado(7);//setea el estado a que está en el
        this.lista.add(proc);
        System.out.println("Procesos en semáforo: "+this.lista);
    }

    public Proceso sacar_de_cola(){
        Proceso proc = null;
        if(!this.lista.isEmpty()){
            proc = this.lista.poll();
        }
        return proc;
    }

    public String toString(){
        return "Semáforo "+this.identificador;
    }

}